在创建shell脚本文件时必须在文件的第一行指定要使用的shell,其格式为:#!/bin/bash,
在通常的shell脚本中,井号(#)用作注释行,shell脚本不会处理shell脚本中的注释行,但是第一行是个例外,后面的!号会告诉shell用哪个shell来运行脚本。
- 为了运行shell脚本,有两种方法:
- 将shell脚本文件所处的目录添加到PATH环境变量中
- 在提示符中用绝对路径或相对文件路径来引用shell脚本文件
- 需要的是当创建一个shell脚本文件后,默认的shell脚本文件没有可执行的权限,可以通过chmod命令来为shell添加可执行的权限,例如:
chmod u+x test1
在shell脚本文件中,如果想把文本字符串和命令输出显示在同一行中,可以使用echo语句的-n参数,例如:
12echo -n "The time and date are: "date这样文本字符串和命令输出就会显示在同一行,需要注意的是此时字符串的两侧需要使用引号
- 在Shell脚本中,可以在环境变量前面加上
$
符号来使用环境变量:$UID
$HOME
- shell脚本中的用户变量是区分大小写的,所以Var1 和 var1是不同的
- 使用等号将值赋给用户变量,在变量、等号和值之间不能出现空格,例如:var1=10,shell脚本会自动决定变量值的数据类型,在脚本的整个生命周期中shell脚本中定义的变量会一直保持着它们的值,但在shell脚本结束时会被删除掉,与系统变量类似,用户变量可通过
$
符号引用。
有两种方法可以将命令输出赋给变量:
- 反引号字符(`)
$()
格式
命令替换允许你将shell命令的输出赋给变量,例如:
testing=$(date)
,那么变量testing将获得date命令的输出。举个例子,在脚本中通过命令替换获得当前日期并用它来生成唯一文件名:
123#!/bin/bashtoday=$(date +%y%m%d)ls /usr/bin -al > log.$today命令替换会创建出一个子shell来运行对应的命令,子shell是由运行该脚本的shell所创建出来的一个独立的子shell,正因为如此子shell所执行命令是无法使用脚本中所创建的变量的。在命令提示符下使用路径./运行命令的话也会创建出子shell,要是运行命令的时候不加入路径,就不会创建子shell,如果你使用的是内建的shell命令,并不会涉及子shell。
- bash shell用大于号完成将命令的输出发送到一个文件中,例如
command > outputfile
,如果希望不覆盖文件原有内容,而是将命令的输出追加到已有文件中,可以使用>>来追加数据
- 输入重定向将文件的内容重定向到命令,使用<来实现:
command < inputfile
,例如:wc < test
表示将test文件中的数据输入到wc中,wc命令可以对数据中的文本进行计数,默认情况下会输出3个值:- 文本的行数
- 文本的词数
- 文本的字节数
内联输入重定向无需使用文件进行重定向,只需要在命令行中指定用于输入重定向的数据即可,内联输入重定向符号是<<,除了这个符号,必须指定一个文本标记来划分输入数据的开始和结尾,任何字符串都可作为文本标记,但在数据的开始和结尾文本标记必须一致:
123command << markerdatamarker举个例子:
- 12345wc << EOFtest string 1test string 2test string 3EOF
在bash中,在将一个数学运算结果赋给某个变量时,可以用美元符和方括号
($[ operation ])
将数学表达式围起来,例如:123456#!/bin/bashvar1=100var2=50var3=45var4=[var1 * (var2 - var3)]echo $var4bash shell数学运算符只支持整数运算,若要进行浮点数运算,可以考虑zshell
bc命令可以进入bash计算器,要退出bash计算器,必须输入quit。浮点运算是由内建变量scale控制的,必须将这个值设置为你希望在计算结果中保留的小数位数,否则无法得到期望的结果。
bc -q
指令可以不显示bash计算器冗长的欢迎信息。在脚本中可以这样使用bash计算器,需要使用命令替换运行bc命令,并将输出赋给给一个变量
variable=$(echo "options; expression" | bc)
,第一部分options允许你设置变量,如果需要设置不止一个变量,可以用分号将其分开,expression参数定义了通过bc执行的数学表达式:123#!/bin/bashvar1=$("scale=4; 3.44 / 5" | bc)echo The answer is $var1另外一种使用方法是使用内联输入重定向:
123456variable=$(bc << EOFoptionsstatementexpressionsEOF)举个例子:
123456789101112!#/bin/bashvar1=10.46var2=43.67var3=33.2var4=71var5=$(bc << EOFscale = 4a1 = (var1 * var2)a2 = (var3 * var4)a1 + a2EOF)需要注意的是在bash计算器中创建的变量只在bash计算器中有效,不能在shell脚本中使用。
- shell中每个运行的命令都使用退出状态码告诉shell它已经运行完毕,退出状态码是一个0-255之间的整数值,在命令结束运行时由命令传给shell。
- 可以使用变量$?来保存上个已执行命令的退出状态码,一个成功结束的命令的退出状态码是0,如果一个命令结束时有错误,退出状态码就是一个正数值
- 默认情况下shell脚本会以脚本中的最后一个命令的退出状态码退出,可以使用exit命令在脚本结束时指定一个退出状态码